/**
 * Copyright (c) 2015-2017, Henry Yang 杨勇 (gismail@foxmail.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.lambkit.module.upms.api;

import com.lambkit.component.shiro.processer.AuthorizeResult;
import com.lambkit.db.sql.IQuery;
import com.lambkit.db.sql.column.Example;
import com.lambkit.module.upms.record.*;

import java.lang.annotation.Annotation;
import java.util.List;

/**
 * upms系统接口
 */
public interface UpmsApiService {
	
	AuthorizeResult invoke(String target, Annotation[] annotations);

    /**
     * 根据用户id获取所拥有的权限(用户和角色权限合集)
     * @param upmsUserId
     * @return
     */
    List<UpmsPermission> selectUpmsPermissionByUpmsUserId(Long upmsUserId);

    /**
     * 根据用户id获取所拥有的权限(用户和角色权限合集)
     * @param upmsUserId
     * @return
     */
    List<UpmsPermission> selectUpmsPermissionByUpmsUserIdByCache(Long upmsUserId);

    /**
     * 查询并新建权限
     * @param permission
     * @return
     */
    UpmsPermission selectOrCreateUpmsPermission(UpmsPermission permission);

    /**
     * 根据用户id获取所属的角色
     * @param upmsUserId
     * @return
     */
    List<UpmsRole> selectUpmsRoleByUpmsUserId(Long upmsUserId);

    /**
     * 根据用户id获取所属的角色
     * @param upmsUserId
     * @return
     */
    List<UpmsRole> selectUpmsRoleByUpmsUserIdByCache(Long upmsUserId);
    List<UpmsUserRole> selectUpmsUserRoleByUpmsUserIdByCache(Long upmsUserId);

    /**
     * 根据角色id获取所拥有的权限
     * @param upmsRoleId
     * @return
     */
    List<UpmsRolePermission> selectUpmsRolePermisstionByUpmsRoleId(Long upmsRoleId);

    /**
     * 根据用户id获取所拥有的权限
     * @param upmsUserId
     * @return
     */
    List<UpmsUserPermission> selectUpmsUserPermissionByUpmsUserId(Long upmsUserId);

    /**
     * 根据条件获取系统数据
     * @param upmsSystemExample
     * @return
     */
    List<UpmsSystem> selectUpmsSystemByExample(Example upmsSystemExample);
    List<UpmsSystem> selectUpmsSystemByQuery(IQuery paras);
    Long selectUpmsSystemCount(Example upmsSystemExample);
    
    /**
     * 根据用户id获取所属的组织
     * @param upmsUserId
     * @return
     */
    List<UpmsOrganization> selectUpmsOrganizationByUpmsUserId(Long upmsUserId);
    List<UpmsUserOrganization> selectUpmsUserOrganizationByUpmsUserId(Long upmsUserId);
    /**
     * 根据条件获取组织数据
     * @param upmsOrganizationExample
     * @return
     */
    List<UpmsOrganization> selectUpmsOrganizationByExample(Example upmsOrganizationExample);
    List<UpmsOrganization> selectUpmsOrganizationByQuery(IQuery paras);
    
    /**
     * 根据username获取UpmsUser
     * @param username
     * @return
     */
    UpmsUser selectUpmsUserByUsername(String username);
    
    UpmsUser selectUpmsUserByEmail(String email);
    
    UpmsUser selectUpmsUserByPhone(String phone);
    
    UpmsUser selectUpmsUserByLoginName(String LoginName);

    UpmsUser selectUpmsUserByUserId(Long upmsUserId);
    /**
     * 写入操作日志
     * @param record
     * @return
     */
    int insertUpmsLogSelective(UpmsLog record);

    /**
     * 根据角色ID获取用户列表
     * @param id
     * @return
     */
	List<UpmsUser> selectUpmsUserByRoleId(Long id);

    /**
     * 根据roleid获取role
     * @param roleId
     * @return
     */
    UpmsRole selectUpmsRoleByRoleId(Long roleId);

    /**
     * 验证当前用户是否属于该角色？
     *
     * @param roleid
     *            角色id
     * @return 属于该角色：true，否则false
     */
    Boolean hasRole(Long userid, Long roleid);
    /**
     * 验证当前用户是否属于该角色？,使用时与lacksRole 搭配使用
     *
     * @param roleName
     *            角色名
     * @return 属于该角色：true，否则false
     */
    Boolean hasRole(Long userid, String roleName);
    /**
     * 与hasRole标签逻辑相反，当用户不属于该角色时验证通过。
     *
     * @param roleName
     *            角色名
     * @return 不属于该角色：true，否则false
     */
    Boolean lacksRole(String roleName);
    /**
     * 验证当前用户是否属于以下任意一个角色。
     *
     * @param roleNames
     *            角色列表
     * @return 属于:true,否则false
     */
    Boolean hasAnyRoles(Long userid, String roleNames);
    /**
     * 验证当前用户是否属于以下所有角色。
     *
     * @param roleNames
     *            角色列表
     * @return 属于:true,否则false
     */
    Boolean hasAllRoles(Long userid, String roleNames);
    /**
     * 验证当前用户是否拥有指定权限
     * @param ruleid
     * @return
     */
    Boolean hasRule(Long userid, Long ruleid);
    /**
     * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用
     *
     * @param permission
     *            权限名
     * @return 拥有权限：true，否则false
     */
    Boolean hasRule(Long userid, String permission);
    /**
     * 与hasPermission标签逻辑相反，当前用户没有制定权限时，验证通过。
     *
     * @param permission
     *            权限名
     * @return 拥有权限：true，否则false
     */
    Boolean lacksRule(String permission);

    /**
     * 验证当前用户是否属于以下任意一个权限。
     *
     * @param permissions
     *            权限列表
     * @return 属于:true,否则false
     */
    Boolean hasAnyRules(Long userid, String permissions);
    /**
     * 验证当前用户是否属于以下所有权限。
     *
     * @param permissions
     *            权限列表
     * @return 属于:true,否则false
     */
    Boolean hasAllRules(Long userid, String permissions);

}
